#include <iostream>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>

std::string toHex(long unsigned int a)
{
    char buff[32] = {0};
    snprintf(buff, sizeof(buff), "0x%lx", a);
    return buff;
}
void *run(void *arg)
{
    // PTHREAD_CANCELED;
    // pthread_cancel(pthread_self());
    // pthread_exit((void*)10);
    int n = pthread_detach(pthread_self());
    if(n!=0)
    {
        perror("detach error");
        return (void*)-1;
    }
    std::cout<<"detach success"<<std::endl;

    while (true)
    {
        std::cout << "new thread:" << (char *)arg << ",tid:" << toHex(pthread_self()) << std::endl;
        sleep(1);
        // exit(1);
    }
    // 设置取消状态为延迟取消（默认），这样线程会定期检查取消请求
    // pthread_setcancelstate(PTHREAD_CANCEL_DEFERRED, nullptr);
    // for(int i = 0;i<5;i++)
    // {
    //     std::cout<<"hello world"<<std::endl;
    //     sleep(1);
    // }
    return (void *)10;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, run, (void *)"thread-1");
    void *ret;
    // int n = pthread_cancel(tid);
    // if(n!=0)
    // {
    //     perror("cancel error");
    //     return 1;
    // }
    // std::cout<<"cancel success"<<std::endl;

    //pthread_join(tid, &ret);
    while (true)
    {
        std::cout << "main thread:" << ",tid:" << toHex(pthread_self()) << std::endl;
        //std::cout << "result is " << (long long)ret << std::endl;

        sleep(1);
    }
    // if (n1 != 0)
    // {
    //     perror("join error");
    //     return 1;
    // }
    // std::cout << "join success" << std::endl;
    // while(true);
    return 0;
}

// class Data
// {
// public:
//     Data(std::string name,int a,int b):_name(name),_a(a),_b(b)
//     {

//     }

//     std::string GetName(){return _name;}
//     void Exe(){_result = _a+_b;}
//     int GetA(){return _a;}
//     int GetB(){return _b;}
//     int GetResult(){return _result;}
// private:
//     std::string _name;
//     int _a;
//     int _b;
//     int _result = 0;
// };
// std::string toHex(long unsigned int a)
// {
//     char buff[32]= {0};
//     snprintf(buff,sizeof(buff),"0x%lx",a);
//     return buff;
// }

// void *run(void *arg)
// {

//     std::cout<<"name:"<<((Data*)arg)->GetName()<<",a:"<<((Data*)arg)->GetA()<<",b:"<<((Data*)arg)->GetB()<<std::endl;
//     ((Data*)arg)->Exe();
//     // while (true)
//     // {
//     //     std::cout << "new thread, " << ((char *)arg) <<" tid:"<<toHex(pthread_self())<< std::endl;
//     //     sleep(1);
//     //     break;
//     // }
//     return (void*)10;
// }
// int main()
// {
//     pthread_t tid1;
//     Data d("thread-1",10,20);
//     pthread_create(&tid1, nullptr, run, &d);

//     //pthread_create(&tid1, nullptr, run, (void *)"thread-1");
//     //pthread_t tid2;
//     //pthread_create(&tid2, nullptr, run, (void *)"thread-2");

//     void* ret;
//     int n =  pthread_join(tid1,&ret);
//     if(n!=0)
//     {
//         std::cout<<"errno num:"<<n;
//         perror("");
//         return 1;
//     }
//     std::cout<<"join success, ret:"<<((long long)ret)<<std::endl;
//     std::cout<<"result is "<<d.GetResult()<<std::endl;
//     while (true)
//     {
//         std::cout << "main thread,tid:" << toHex(tid1)<<std::endl;
//         sleep(1);
//     }
//     // pid_t pid = vfork();
//     // if(pid==0)
//     // {
//     //     std::cout<<"Child process:"<<getpid()<<std::endl;
//     //     while(true);
//     // }
//     // while (true)
//     // {
//     //     std::cout << "我是一个主线程pid:" << getpid() << std::endl;
//     //     sleep(1);
//     // }
//     return 0;
// }